# 版本: 1.0.0
# 作者: 陈振玺
# 功能: 验证Excel或CSV文件中指定列的文件路径是否存在

import argparse
import os
import pandas as pd
from pathlib import Path


def validate_file_paths(file_path: str, column_name: str, file_type: str = 'csv') -> dict:
    """
    验证文件中指定列的文件路径是否存在
    
    :param file_path: Excel或CSV文件路径
    :param column_name: 需要验证的列名
    :param file_type: 文件类型，'csv' 或 'excel'
    :return: 包含验证结果的字典
    """
    # 读取文件
    if file_type.lower() == 'excel':
        df = pd.read_excel(file_path)
    else:
        df = pd.read_csv(file_path)
    
    # 检查列是否存在
    if column_name not in df.columns:
        raise ValueError(f"列 '{column_name}' 不存在于文件中")
    
    # 获取指定列的所有路径
    paths = df[column_name].dropna().tolist()
    
    # 验证每个路径
    results = {
        'total_count': len(paths),
        'existing_count': 0,
        'missing_count': 0,
        'existing_paths': [],
        'missing_paths': []
    }
    
    for path in paths:
        # 处理相对路径和绝对路径
        full_path = Path(path).resolve()
        if full_path.exists():
            results['existing_count'] += 1
            results['existing_paths'].append(str(full_path))
        else:
            results['missing_count'] += 1
            results['missing_paths'].append(str(full_path))
    
    return results


def print_results(results: dict) -> None:
    """
    打印验证结果
    
    :param results: validate_file_paths函数返回的结果字典
    """
    print(f"总计文件路径数: {results['total_count']}")
    print(f"存在的文件数: {results['existing_count']}")
    print(f"不存在的文件数: {results['missing_count']}")
    
    if results['missing_paths']:
        print("\n不存在的文件路径:")
        for path in results['missing_paths']:
            print(f"  {path}")
    else:
        print("\n所有文件路径均存在。")


def main():
    """
    命令行主函数
    """
    parser = argparse.ArgumentParser(description='验证Excel或CSV文件中指定列的文件路径是否存在')
    parser.add_argument('file_path', help='Excel或CSV文件路径')
    parser.add_argument('column_name', help='需要验证的列名')
    parser.add_argument('--file-type', choices=['csv', 'excel'], default='csv', 
                        help='文件类型 (默认: csv)')
    
    args = parser.parse_args()
    
    # 检查输入文件是否存在
    if not os.path.exists(args.file_path):
        print(f"错误: 文件 '{args.file_path}' 不存在")
        return
    
    try:
        results = validate_file_paths(args.file_path, args.column_name, args.file_type)
        print_results(results)
    except Exception as e:
        print(f"错误: {e}")


if __name__ == "__main__":
    main()